package structuralPattern.adapter;

/**
 * @Author: Alex Hu
 * Date: 2020/2/22 4:39 下午
 * Content: 类适配器模式示例
 * 设计意图：将一个类的接口转换成客户希望的另外一个接口，使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
 * 使用场景：当需要将不兼容的接口转换为可兼容的接口时使用
 */

/**
 * 目标接口
 * 设计意图：定义客户所期望的接口
 * 使用场景：当需要定义统一的接口规范时使用
 */
interface Target {
    /**
     * 请求方法
     * 设计意图：定义客户期望的请求方法
     * 使用场景：当需要发送请求时调用
     */
    void request();
}

/**
 * 适配者类
 * 设计意图：定义需要被适配的类
 * 使用场景：当需要被适配的类具有不兼容的接口时使用
 */
class Adaptee {
    /**
     * 特殊请求方法
     * 设计意图：定义适配者的特殊请求方法
     * 使用场景：当需要发送特殊请求时调用
     */
    public void specificRequest() {
        System.out.println("适配者中的业务代码被调用！");
    }
}

/**
 * 类适配器
 * 设计意图：将适配者接口转换为目标接口
 * 使用场景：当需要通过继承方式实现适配时使用
 */
class ClassAdapter extends Adaptee implements Target {
    /**
     * 请求方法
     * 设计意图：实现目标接口的请求方法，调用适配者的特殊请求方法
     * 使用场景：当需要将特殊请求转换为标准请求时调用
     */
    @Override
    public void request() {
        specificRequest();
    }
}

/**
 * 客户端代码
 */
public class ClassAdapterTest {
    /**
     * 主方法：演示类适配器模式
     * 设计意图：通过适配器将不兼容的接口转换为可兼容的接口
     * 使用场景：当需要测试或演示类适配器模式时调用
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        System.out.println("类适配器模式测试：");
        Target target = new ClassAdapter();
        target.request();
    }
}

